package com.xiaobias.a06;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
import org.springframework.context.annotation.CommonAnnotationBeanPostProcessor;
import org.springframework.context.annotation.ConfigurationClassPostProcessor;
import org.springframework.context.support.GenericApplicationContext;

/*
Aware 接口及 InitializingBean 接口
 */
public class A06Application {
     private static final Logger logger = LoggerFactory.getLogger(A06Application.class);

    public static void main(String[] args) {
        /*
        1. Aware 接口用于注入一些与容器相关信息， 例如
            a. BeanNameAware 注入 bean 的名字
            b. BeanFactoryAware 注入 BeanFactory 容器
            c. ApplicationContextAware 注入 ApplicationContext 容器
            d. EmbeddedValueResolverAware ${}
         */

        GenericApplicationContext context = new GenericApplicationContext();
//        context.registerBean("myBean", MyBean.class);
//        context.registerBean("myConfig1", MyConfig1.class);
        context.registerBean("myConfig2", MyConfig2.class);
        context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
        context.registerBean(CommonAnnotationBeanPostProcessor.class);
        context.registerBean(ConfigurationClassPostProcessor.class);


        /*
        2. 有小伙伴说：b、c、d 的功能用 @Autowired 就能实现，为什么还要用 Aware 接口呢？简单地说：
            a. @Autowired 的解析需要用到bean的后置处理器，属于扩展功能
            b. 而 Aware 接口属于内置功能， 不加任何扩展， Spring 就能识别
        某些情况下，扩展功能为失效，而内置功能不会失效

        例1: 你会发现用  Aware 注入 ApplicationContext 成功， 而 @Autowired 注入 ApplicationContext 失败。
         */

        /*
        例2: Java 配置类再添加了 bean 工厂后置处理器后，
            你会发现现用传统接口方式的注入和初始化仍然成功， 而 @Autowired 和 @PostConstruct 的注入和初始化失败
         */
        context.refresh();
        context.close();
    }
}
